<?php
//permet de faire le mapping objet-relationnel des reservations objet<-->reservations bd
Class ReservationDAOMysql implements iDAO{
	
	
	protected $connexion;
	protected $table='reservation';
	protected $clientDAO;
	
	public function __construct (){
	
		//on recupere la connexion
		$this->connexion=Connexion::getInstance()->getConnexion();
		//on recupere notre client en meme temps que la reservation ->c'est pourquoi on utilise clientDAO
		$DAOfactory=AbstractDAOFactory::getDaoFactory(AbstractDAOFactory::MYSQL);
		$this->clientDAO=$DAOfactory->getClientDAO();
	}
	
	//recupere toutes les reservations
	public function getAll(){
	  $sql = "SELECT * FROM ".$this->table;
	  return $this->executeQuery($sql);
	}
	
	//recupere une reservation par son id
	public function getById($id){
	  $sql = "SELECT * FROM ".$this->table ." WHERE ID=".$id;
	  return $this->executeQuery($sql);
	}
	
	//recupere les reservations d'un client
	public function getByIdClient($idclient){
	  $sql = "SELECT * FROM ".$this->table ." WHERE ID_UTILISATEUR=".$idclient;
	  return $this->executeQuery($sql);
	}
	
	public function getByName($nom){
	 //on redefinir on garde la fonction pour l'interface iDAO
	}
	
	
	
	//ici on execute une requete de type select et on renvoie un tableau composé d'objets
	public function executeQuery($sql) {
		
		$TabObjets = array();
        $result =$this->connexion->query($sql);
		$this->throwExceptionOnError();
		
		
		 if($result) {
           while($row = $result->fetch_object()){
					
                	// on cree d'abord une carte bancaire
					$carteBancaire = new CarteBancaire();
					$carteBancaire->setTypeCarte(stripslashes($row->TYPE_CARTE));
					$carteBancaire->setDateExpiration(stripslashes($row->DATE_EXPIRATION_CARTE));
					$carteBancaire->setNumeroCarte(stripslashes($row->NUM_CARTE));
					$carteBancaire->setCleCarte(stripslashes($row->CLE_CARTE));
					//puis la reservation avec le client
					$reservation = new Reservation();
                	$reservation->setId($row->ID);
                	$reservation->setDateReservation(stripslashes($row->DATE_RESERVATION));
					$reservation->setCarteBancaire($carteBancaire);
					$clientTab=$this->clientDAO->getById($row->ID_UTILISATEUR);
					$reservation->setClient($clientTab[0]);
					$TabObjets[]=$reservation;
			}
		}
		
		return $TabObjets;
	}

	public function research($reservation)
	{

	//peut être redefini pas besoin de cette methode pour la reservation dans le contexte du projet ->conservation de la methode pour la coherence interface iDAO
	}
	
	
	
 //methode permettant de modifier une reservation  en bd
	public function update($reservation) {
		
		$sql="UPDATE ".$this->table." SET ID_UTILISATEUR=?, DATE_RESERVATION=?, NUM_CARTE=?,TYPE_CARTE=?, DATE_EXPIRATION_CARTE=?, CLE_CARTE=?  WHERE ID=?";
			//on prepare la requete
			$stmt = $this->connexion->prepare($sql);
			//on rempli avec les parametres necessaires à la requete parametree
			$stmt->bind_param('isssssi', $reservation->getClient()->getId(), $reservation->getDateReservation(),$reservation->getCarteBancaire()->getNumeroCarte(),$reservation->getCarteBancaire()->getTypeCarte(),$reservation->getCarteBancaire()->getDateExpiration(),$reservation->getCarteBancaire()->getCleCarte(),$reservation->getId());
         	//on execute la requete
			$stmt->execute();
			$this->throwExceptionOnError();
			
	}
	
 //methode permettant d inserer une reservation  en bd
	public function insert($reservation) {
		
		$sql="INSERT INTO ".$this->table." (ID_UTILISATEUR ,DATE_RESERVATION ,NUM_CARTE ,TYPE_CARTE , DATE_EXPIRATION_CARTE ,CLE_CARTE) VALUES(?,?,?,?,?,?)";
		//on prepare la requete
		$stmt = $this->connexion->prepare($sql);
		//on rempli avec les parametres necessaires à la requete parametree
		$stmt->bind_param('isssss', $reservation->getClient()->getId(), $reservation->getDateReservation(),$reservation->getCarteBancaire()->getNumeroCarte(),$reservation->getCarteBancaire()->getTypeCarte(),$reservation->getCarteBancaire()->getDateExpiration(),$reservation->getCarteBancaire()->getCleCarte());
		//on execute la requete
		$stmt->execute();
		$this->throwExceptionOnError();
	    return $this->connexion->insert_id;
	
	}
	
		//supression d'une reservation
	public function delete($id){

		 $sql = "DELETE  FROM ".$this->table ." WHERE ID=?";
	 	 $stmt = $this->connexion->prepare($sql);
	     $stmt->bind_param('i', $id);
	 	 $stmt->execute(); 
	 	 $this->throwExceptionOnError();
	}


	//si quelque chose c'est mal passé
	private function throwExceptionOnError(){
	
		if($this->connexion->error){
			throw new Exception('Erreur mysql'.$this->connexion->error);
		}
	}
	
	
}

?>